﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace HCMUS_SearchService_Group2
{
    public static class Filter
    {
        /////////////////////////////////////////////////
        /// \brief Hàm Lấy tất cả dữ liệu ContentDataDTO chứa giá từ bộ dữ liệu ContentDataDTO đầu vào
        /// \returns List<ContentDataDTO>.
        /// \details <h3>Lấy tất cả dữ liệu chứa giá từ bộ dữ liệu đầu vào</h3>
        /////////////////////////////////////////////////
        public static List<ContentDataDTO> GetDatafromPrice(List<ContentDataDTO> input, int Price)
        {
            List<ContentDataDTO> datas = new List<ContentDataDTO>();
            List<int> lstMaDuLieu = new List<int>();
            lstMaDuLieu = (from info in SearchHelper.ServiceDetails
                           join dd in SearchHelper.DetailDatas on info.DetailId equals dd.DetailId
                           where Price == info.Price
                           select dd.MaDuLieu).ToList();

            foreach (ContentDataDTO data in input)
                if (lstMaDuLieu.Contains(data.MaDuLieu))
                    datas.Add(data);
            return datas;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm Lấy tất cả dữ liệu ContentDataDTO chứa giá từ bộ dữ liệu ContentDataDTO đầu vào
        /// \returns List<ContentDataDTO>.
        /// \details <h3>Lấy tất cả dữ liệu chứa giá từ bộ dữ liệu đầu vào</h3>
        /////////////////////////////////////////////////
        public static List<ContentDataDTO> GetDatafromStreet(List<ContentDataDTO> input, string StreetName)
        {
            List<ContentDataDTO> datas = new List<ContentDataDTO>();
            datas = (from info in input
                     where StreetName == info.StreetName
                     select info).ToList();
            return datas;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm sort dữ liệu ContentDataDTO từ bộ dữ liệu ContentDataDTO đầu vào
        /// \returns List<ContentDataDTO>.
        /// \details <h3>Sắp xếp dữ liệu tăng/giảm dần từ bộ dữ liệu đầu vào</h3>
        /////////////////////////////////////////////////
        public static List<ContentDataDTO> SortStreetName(List<ContentDataDTO> input, bool increase)
        {
            List<ContentDataDTO> listResult = new List<ContentDataDTO>();
            listResult = (from data in input
                          select data).ToList();
            listResult.Sort((item1, item2) =>
            {
                int result = item1.StreetName.CompareTo(item2.StreetName);
                if (result == 0)
                {
                    string str1 = item1.Address.Split(new string[] { item1.StreetName }, StringSplitOptions.RemoveEmptyEntries)[0].Trim();
                    string str2 = item2.Address.Split(new string[] { item2.StreetName }, StringSplitOptions.RemoveEmptyEntries)[0].Trim();
                    //Get So Nha                    
                    int sonha1, sonha2;
                    sonha1 = SlitNumberFromString(str1);
                    sonha2 = SlitNumberFromString(str2);
                    if (str1.Length == 0 || str2.Length == 0 || sonha1 == sonha2)
                        if (increase) return item1.Address.CompareTo(item2.Address);
                        else return item2.Address.CompareTo(item1.Address);
                    int rs = 0;
                    if (sonha1 > sonha2)
                        rs = 1;
                    if (sonha1 < sonha2)
                        rs = -1;
                    if (increase)
                        return rs;
                    else
                        return rs * -1;
                }
                else
                {
                    if (increase)
                        return result;
                    else
                        return result * -1;
                }
            });
            List<string> lstAddress = new List<string>();
            foreach (ContentDataDTO a in listResult)
                lstAddress.Add(a.Address);
            return listResult;
        }

        private static int SlitNumberFromString(string str2)
        {
            int i = 0;
            bool hasInValue = false;
            int rs = 0;
            string tempStr = str2;
            for (i = 0; i < tempStr.Length; i++)
                if (tempStr[i] < '0' || tempStr[i] > '9')
                {
                    tempStr = tempStr.Replace(tempStr[i], ' ');
                    hasInValue = true;
                }

            if (i != 0)
            {
                if (hasInValue)
                {
                    string[] str = tempStr.Split(new char[] { ' ' });
                    tempStr = string.Empty;
                    for (int j = 0; j < str.Count(); j++)
                        tempStr += str[j];
                }
                rs = Convert.ToInt32(tempStr.Trim());
            }
            return rs;
        }
    }
}
